import { normalizeContainer } from '../../Func/normalizeContainer';
import { prop_keyVal_node_for_form } from './Classes/cla_keyVal_node_props';
import {
  keyVal_for_key,
  keyVal_node_inp,
  spacename_keyVal_node,
} from './DataDefine/sourceData';

let glo_weakMap = new WeakMap<HTMLInputElement, any>();

/**
 * 根据 给定的 form 值 获取 当前页面中 所有 的 keyVal_node 元素 信息
 * @param form_key 表单名
 */
export function get_keyVal_form_info(form_key: string) {
  let collection_form_node = get_collection_keyVal_node_by_form_key(form_key);

  return get_collection_keyVal_node_info(collection_form_node);
}

/**
 * 获取 指定 form_key 的 当前页面 的 所有 keyVal_node 元素
 * @param form_key 表单名
 */
export function get_collection_keyVal_node_by_form_key(form_key: string) {
  let ret: HTMLInputElement[] = [];

  let collection_keyVal_node: HTMLInputElement[] =
    document.getElementsByClassName(keyVal_node_inp) as any;

  for (const cur_node of collection_keyVal_node) {
    if (cur_node.getAttribute(prop_keyVal_node_for_form) == form_key) {
      ret.push(cur_node);
    }
  }

  return ret;
}

/**
 * 获取 当前 keyVal_node 值
 * @param cur_node 当前 keyVal_node
 */
export function get_keyVal_node_info(cur_node: HTMLInputElement) {
  return glo_weakMap.get(cur_node);
}

export function get_collection_keyVal_node_info(
  cur_node_arr: Element[] | HTMLCollection
) {
  let ret: { [_: string]: any } = {};
  for (const cur_node of cur_node_arr) {
    let keyVal_node_id = cur_node.getAttribute(spacename_keyVal_node)!;

    if (keyVal_node_id == null) {
      continue;
    }

    let keyVal_node: HTMLInputElement = normalizeContainer(
      keyVal_node_id
    ) as any;

    if (keyVal_node == null) {
      continue;
    }

    let cur_keyVal_dom_for_key = keyVal_node.getAttribute(keyVal_for_key);

    if (cur_keyVal_dom_for_key == null) {
      continue;
    }

    ret[cur_keyVal_dom_for_key] = get_keyVal_node_info(keyVal_node);
  }

  return ret;
}

/**
 * 记录 当前 keyVal_node 值
 * @param cur_node 当前 keyVal_node
 * @param val 值
 */
export function set_keyVal_node_info(cur_node: HTMLInputElement, val: any) {
  glo_weakMap.set(cur_node, val);
}

/**
 * 取消 信息 记录
 * @param cur_node
 */
export function remove_keyVal_node_info(cur_node: HTMLInputElement) {
  glo_weakMap.delete(cur_node);
}
